package br.com.ac.fatureweb.model.billing;

import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.persistence.UniqueConstraint;

import br.com.ac.fatureweb.enums.EnumStatusCarga;
import br.com.ac.fatureweb.integration.billing.LogLeituraVO;
import br.com.ac.fatureweb.model.Roteiro;
import br.com.ac.fatureweb.service.NgcCadastroBean;
import br.com.ac.fatureweb.utilitary.Model;

@Entity
@Table(name = "LOG_LEITURA", uniqueConstraints = { @UniqueConstraint(columnNames = {
		"MES", "ANO", "INSCRICAO", "ID_CARGA", "ID_ROTEIRO" }) })
@SequenceGenerator(name = "SEQ_LOG_LEITURA", sequenceName = "SEQ_LOG_LEITURA", allocationSize = 1, initialValue = 1)
public class LogLeitura extends Model {

	/**
	 *
	 */
	private static final long serialVersionUID = 3629936114009526127L;

	@Id
	@GeneratedValue(generator = "SEQ_LOG_LEITURA", strategy = GenerationType.SEQUENCE)
	@Column(name = "SEQ")
	private Long seq;

	@Column(name = "ID")
	private Long id;

	@Column(name = "MES")
	private Long mes;

	@Column(name = "ANO")
	private Long ano;

	@Column(name = "LEITURA")
	private Long leitura;

	@Column(name = "DATA_LEITURA")
	private Date dataLeitura;

	@Column(name = "VALOR_CONTA")
	private Double valorConta;

	@Column(name = "QTDE_IMPRESSAO")
	private Long qtdeImpressao;

	@Column(name = "LEITURA_CONFIRMADA")
	private Boolean leituraConfirmada;

	@Column(name = "COD_OCORRENCIA1")
	private Long codOcorrencia1;

	@Column(name = "ID_LEITURISTA")
	private Long idLeiturista;

	@Column(name = "INSCRICAO", nullable = false)
	private Long inscricao;

	@Column(name = "ID_CARGA", nullable = false)
	private Long idCarga;

	@Column(name = "OBSERVACAO")
	private String observacao;

	@Column(name = "COD_OCORRENCIA2")
	private Long codOcorrencia2;

	@Column(name = "CONTA_RETIDA")
	private Integer contaRetida;

	@Column(name = "CONTA_REGERADA")
	private Boolean contaRegerada;

	@Column(name = "FOTO")
	private Boolean foto;

	@Column(name = "LONGITUDE")
	private Double longitude;

	@Column(name = "LATITUDE")
	private Double latitude;

	@Column(name = "CONSUMO")
	private Long consumo;

	@Column(name = "VALOR_AGUA")
	private Double valorAgua;

	@Column(name = "VALOR_ESGOTO")
	private Double valorEsgoto;

	@Column(name = "VALOR_SERVICOS")
	private Double valorServicos;

	@Column(name = "VALOR_TOTAL")
	private Double valorTotal;

	@ManyToOne(fetch = FetchType.LAZY, optional = false)
	@JoinColumn(name = "ID_ROTEIRO", referencedColumnName = "ID")
	private Roteiro roteiro;

	@Column(name = "STATUS")
	@Enumerated(EnumType.ORDINAL)
	private EnumStatusCarga enumStatus;

	@Transient
	private String dscOcorrencia1;

	@Transient
	private String dscOcorrencia2;

	/**
	 * @author Brunno Gonçalves (brunnogoncalves@gmail.com) 16/03/2015
	 * @return
	 */
	public String getCompetencia() {
		if (mes != null && ano != null) {
			return mes + "/" + ano;
		}
		return null;
	}

	public LogLeitura() {
		super();
	}

	public LogLeitura(Long seq, Long id, Long mes, Long ano, Long leitura,
			Date dataLeitura, Double valorConta, Long qtdeImpressao,
			Boolean leituraConfirmada, Long codOcorrencia1, Long idLeiturista,
			Long inscricao, Long idCarga, String observacao,
			Long codOcorrencia2, Integer contaRetida, Boolean contaRegerada,
			Boolean foto, Double longitude, Double latitude, Long consumo,
			Double valorAgua, Double valorEsgoto, Double valorServicos,
			Double valorTotal, Roteiro roteiro) {
		super();
		this.seq = seq;
		this.id = id;
		this.mes = mes;
		this.ano = ano;
		this.leitura = leitura;
		this.dataLeitura = dataLeitura;
		this.valorConta = valorConta;
		this.qtdeImpressao = qtdeImpressao;
		this.leituraConfirmada = leituraConfirmada;
		this.codOcorrencia1 = codOcorrencia1;
		this.idLeiturista = idLeiturista;
		this.inscricao = inscricao;
		this.idCarga = idCarga;
		this.observacao = observacao;
		this.codOcorrencia2 = codOcorrencia2;
		this.contaRetida = contaRetida;
		this.contaRegerada = contaRegerada;
		this.foto = foto;
		this.longitude = longitude;
		this.latitude = latitude;
		this.consumo = consumo;
		this.valorAgua = valorAgua;
		this.valorEsgoto = valorEsgoto;
		this.valorServicos = valorServicos;
		this.valorTotal = valorTotal;
		this.roteiro = roteiro;
	}

	/**
	 * {@link NgcCadastroBean#getLogLeitura(Long, Long)}
	 *
	 * @author Brunno Gonçalves (brunnogoncalves@gmail.com) 05/03/2015
	 *
	 * @param seq
	 * @param id
	 * @param mes
	 * @param ano
	 * @param leitura
	 * @param dataLeitura
	 * @param valorConta
	 * @param qtdeImpressao
	 * @param leituraConfirmada
	 * @param codOcorrencia1
	 * @param idLeiturista
	 * @param inscricao
	 * @param idCarga
	 * @param observacao
	 * @param codOcorrencia2
	 * @param contaRetida
	 * @param contaRegerada
	 * @param foto
	 * @param longitude
	 * @param latitude
	 * @param consumo
	 * @param valorAgua
	 * @param valorEsgoto
	 * @param valorServicos
	 * @param valorTotal
	 * @param roteiro
	 * @param dscOcorrencia1
	 * @param dscOcorrencia2
	 */
	public LogLeitura(Long seq, Long id, Long mes, Long ano, Long leitura,
			Date dataLeitura, Double valorConta, Long qtdeImpressao,
			Boolean leituraConfirmada, Long codOcorrencia1, Long idLeiturista,
			Long inscricao, Long idCarga, String observacao,
			Long codOcorrencia2, Integer contaRetida, Boolean contaRegerada,
			Boolean foto, Double longitude, Double latitude, Long consumo,
			Double valorAgua, Double valorEsgoto, Double valorServicos,
			Double valorTotal, Roteiro roteiro, String dscOcorrencia1,
			String dscOcorrencia2) {
		super();
		this.seq = seq;
		this.id = id;
		this.mes = mes;
		this.ano = ano;
		this.leitura = leitura;
		this.dataLeitura = dataLeitura;
		this.valorConta = valorConta;
		this.qtdeImpressao = qtdeImpressao;
		this.leituraConfirmada = leituraConfirmada;
		this.codOcorrencia1 = codOcorrencia1;
		this.idLeiturista = idLeiturista;
		this.inscricao = inscricao;
		this.idCarga = idCarga;
		this.observacao = observacao;
		this.codOcorrencia2 = codOcorrencia2;
		this.contaRetida = contaRetida;
		this.contaRegerada = contaRegerada;
		this.foto = foto;
		this.longitude = longitude;
		this.latitude = latitude;
		this.consumo = consumo;
		this.valorAgua = valorAgua;
		this.valorEsgoto = valorEsgoto;
		this.valorServicos = valorServicos;
		this.valorTotal = valorTotal;
		this.roteiro = roteiro;
		this.setDscOcorrencia1(dscOcorrencia1);
		this.setDscOcorrencia2(dscOcorrencia2);
	}

	public LogLeitura(LogLeituraVO logLeituraVO, Long idRoteiro) {
		super();
		this.id = logLeituraVO.getId();
		this.mes = logLeituraVO.getMes();
		this.ano = logLeituraVO.getAno();
		this.leitura = logLeituraVO.getLeitura();

		if (logLeituraVO.getDataLeitura() != null) {
			Calendar calendar = Calendar.getInstance(new Locale("pt", "BR"));
			calendar.setTimeInMillis(logLeituraVO.getDataLeitura());
			this.dataLeitura = calendar.getTime();
		}

		this.valorConta = logLeituraVO.getValorConta();
		this.qtdeImpressao = logLeituraVO.getQtdeImpressao();
		this.leituraConfirmada = logLeituraVO.getLeituraConfirmada();
		this.codOcorrencia1 = logLeituraVO.getCodOcorrencia1();
		this.idLeiturista = logLeituraVO.getIdLeiturista();
		this.inscricao = logLeituraVO.getInscricao();
		this.idCarga = logLeituraVO.getIdCarga();
		this.observacao = logLeituraVO.getObservacao();
		this.codOcorrencia2 = logLeituraVO.getCodOcorrencia2();
		this.contaRetida = logLeituraVO.getContaRetida();
		this.contaRegerada = logLeituraVO.getContaRegerada();
		this.foto = logLeituraVO.getFoto();
		this.longitude = logLeituraVO.getLongitude();
		this.latitude = logLeituraVO.getLatitude();
		this.consumo = logLeituraVO.getConsumo();
		this.valorAgua = logLeituraVO.getValorAgua();
		this.valorEsgoto = logLeituraVO.getValorEsgoto();
		this.valorServicos = logLeituraVO.getValorServicos();
		this.valorTotal = logLeituraVO.getValorTotal();
		this.roteiro = new Roteiro(idRoteiro);
	}

	public LogLeitura(Long seq, Long id, Long mes, Long ano, Long leitura,
			Date dataLeitura, Double valorConta, Long qtdeImpressao,
			Boolean leituraConfirmada, Long codOcorrencia1, Long idLeiturista,
			Long inscricao, Long idCarga, String observacao,
			Long codOcorrencia2, Integer contaRetida, Boolean contaRegerada,
			Boolean foto, Double longitude, Double latitude, Long consumo,
			Double valorAgua, Double valorEsgoto, Double valorServicos,
			Double valorTotal, Roteiro roteiro, EnumStatusCarga enumStatus,
			String dscOcorrencia1, String dscOcorrencia2) {
		super();
		this.seq = seq;
		this.id = id;
		this.mes = mes;
		this.ano = ano;
		this.leitura = leitura;
		this.dataLeitura = dataLeitura;
		this.valorConta = valorConta;
		this.qtdeImpressao = qtdeImpressao;
		this.leituraConfirmada = leituraConfirmada;
		this.codOcorrencia1 = codOcorrencia1;
		this.idLeiturista = idLeiturista;
		this.inscricao = inscricao;
		this.idCarga = idCarga;
		this.observacao = observacao;
		this.codOcorrencia2 = codOcorrencia2;
		this.contaRetida = contaRetida;
		this.contaRegerada = contaRegerada;
		this.foto = foto;
		this.longitude = longitude;
		this.latitude = latitude;
		this.consumo = consumo;
		this.valorAgua = valorAgua;
		this.valorEsgoto = valorEsgoto;
		this.valorServicos = valorServicos;
		this.valorTotal = valorTotal;
		this.roteiro = roteiro;
		this.enumStatus = enumStatus;
		this.dscOcorrencia1 = dscOcorrencia1;
		this.dscOcorrencia2 = dscOcorrencia2;
	}

	/**
	 * @return the id
	 */
	@Override
	public Long getId() {
		return id;
	}

	/**
	 * @param id
	 *            the id to set
	 */
	@Override
	public void setId(Long id) {
		this.id = id;
	}

	/**
	 * @return the leitura
	 */
	public Long getLeitura() {
		return leitura;
	}

	/**
	 * @param leitura
	 *            the leitura to set
	 */
	public void setLeitura(Long leitura) {
		this.leitura = leitura;
	}

	/**
	 * @return the dataLeitura
	 */
	public Date getDataLeitura() {
		return dataLeitura;
	}

	/**
	 * @param dataLeitura
	 *            the dataLeitura to set
	 */
	public void setDataLeitura(Date dataLeitura) {
		this.dataLeitura = dataLeitura;
	}

	/**
	 * @return the valorConta
	 */
	public Double getValorConta() {
		return valorConta;
	}

	/**
	 * @param valorConta
	 *            the valorConta to set
	 */
	public void setValorConta(Double valorConta) {
		this.valorConta = valorConta;
	}

	/**
	 * @return the qtdeImpressao
	 */
	public Long getQtdeImpressao() {
		return qtdeImpressao;
	}

	/**
	 * @param qtdeImpressao
	 *            the qtdeImpressao to set
	 */
	public void setQtdeImpressao(Long qtdeImpressao) {
		this.qtdeImpressao = qtdeImpressao;
	}

	/**
	 * @return the leituraConfirmada
	 */
	public Boolean getLeituraConfirmada() {
		return leituraConfirmada;
	}

	/**
	 * @param leituraConfirmada
	 *            the leituraConfirmada to set
	 */
	public void setLeituraConfirmada(Boolean leituraConfirmada) {
		this.leituraConfirmada = leituraConfirmada;
	}

	/**
	 * @return the codOcorrencia1
	 */
	public Long getCodOcorrencia1() {
		return codOcorrencia1;
	}

	/**
	 * @param codOcorrencia1
	 *            the codOcorrencia1 to set
	 */
	public void setCodOcorrencia1(Long codOcorrencia1) {
		this.codOcorrencia1 = codOcorrencia1;
	}

	/**
	 * @return the idLeiturista
	 */
	public Long getIdLeiturista() {
		return idLeiturista;
	}

	/**
	 * @param idLeiturista
	 *            the idLeiturista to set
	 */
	public void setIdLeiturista(Long idLeiturista) {
		this.idLeiturista = idLeiturista;
	}

	/**
	 * @return the inscricao
	 */
	public Long getInscricao() {
		return inscricao;
	}

	/**
	 * @param inscricao
	 *            the inscricao to set
	 */
	public void setInscricao(Long inscricao) {
		this.inscricao = inscricao;
	}

	/**
	 * @return the idCarga
	 */
	public Long getIdCarga() {
		return idCarga;
	}

	/**
	 * @param idCarga
	 *            the idCarga to set
	 */
	public void setIdCarga(Long idCarga) {
		this.idCarga = idCarga;
	}

	/**
	 * @return the observacao
	 */
	public String getObservacao() {
		return observacao;
	}

	/**
	 * @param observacao
	 *            the observacao to set
	 */
	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}

	/**
	 * @return the codOcorrencia2
	 */
	public Long getCodOcorrencia2() {
		return codOcorrencia2;
	}

	/**
	 * @param codOcorrencia2
	 *            the codOcorrencia2 to set
	 */
	public void setCodOcorrencia2(Long codOcorrencia2) {
		this.codOcorrencia2 = codOcorrencia2;
	}

	/**
	 * @return the contaRetida
	 */
	public Integer getContaRetida() {
		return contaRetida;
	}

	/**
	 * @param contaRetida
	 *            the contaRetida to set
	 */
	public void setContaRetida(Integer contaRetida) {
		this.contaRetida = contaRetida;
	}

	/**
	 * @return the contaRegerada
	 */
	public Boolean getContaRegerada() {
		return contaRegerada;
	}

	/**
	 * @param contaRegerada
	 *            the contaRegerada to set
	 */
	public void setContaRegerada(Boolean contaRegerada) {
		this.contaRegerada = contaRegerada;
	}

	/**
	 * @return the foto
	 */
	public Boolean getFoto() {
		return foto;
	}

	/**
	 * @param foto
	 *            the foto to set
	 */
	public void setFoto(Boolean foto) {
		this.foto = foto;
	}

	/**
	 * @return the longitude
	 */
	public Double getLongitude() {
		return longitude;
	}

	/**
	 * @param longitude
	 *            the longitude to set
	 */
	public void setLongitude(Double longitude) {
		this.longitude = longitude;
	}

	/**
	 * @return the latitude
	 */
	public Double getLatitude() {
		return latitude;
	}

	/**
	 * @param latitude
	 *            the latitude to set
	 */
	public void setLatitude(Double latitude) {
		this.latitude = latitude;
	}

	/**
	 * @return the seq
	 */
	public Long getSeq() {
		return seq;
	}

	/**
	 * @param seq
	 *            the seq to set
	 */
	public void setSeq(Long seq) {
		this.seq = seq;
	}

	/**
	 * @return the roteiro
	 */
	public Roteiro getRoteiro() {
		return roteiro;
	}

	/**
	 * @param roteiro
	 *            the roteiro to set
	 */
	public void setRoteiro(Roteiro roteiro) {
		this.roteiro = roteiro;
	}

	/**
	 * @return the mes
	 */
	public Long getMes() {
		return mes;
	}

	/**
	 * @param mes
	 *            the mes to set
	 */
	public void setMes(Long mes) {
		this.mes = mes;
	}

	/**
	 * @return the ano
	 */
	public Long getAno() {
		return ano;
	}

	/**
	 * @param ano
	 *            the ano to set
	 */
	public void setAno(Long ano) {
		this.ano = ano;
	}

	/**
	 * @return the consumo
	 */
	public Long getConsumo() {
		return consumo;
	}

	/**
	 * @param consumo
	 *            the consumo to set
	 */
	public void setConsumo(Long consumo) {
		this.consumo = consumo;
	}

	/**
	 * @return the valorAgua
	 */
	public Double getValorAgua() {
		return valorAgua;
	}

	/**
	 * @param valorAgua
	 *            the valorAgua to set
	 */
	public void setValorAgua(Double valorAgua) {
		this.valorAgua = valorAgua;
	}

	/**
	 * @return the valorEsgoto
	 */
	public Double getValorEsgoto() {
		return valorEsgoto;
	}

	/**
	 * @param valorEsgoto
	 *            the valorEsgoto to set
	 */
	public void setValorEsgoto(Double valorEsgoto) {
		this.valorEsgoto = valorEsgoto;
	}

	/**
	 * @return the valorServicos
	 */
	public Double getValorServicos() {
		return valorServicos;
	}

	/**
	 * @param valorServicos
	 *            the valorServicos to set
	 */
	public void setValorServicos(Double valorServicos) {
		this.valorServicos = valorServicos;
	}

	/**
	 * @return the valorTotal
	 */
	public Double getValorTotal() {
		return valorTotal;
	}

	/**
	 * @param valorTotal
	 *            the valorTotal to set
	 */
	public void setValorTotal(Double valorTotal) {
		this.valorTotal = valorTotal;
	}

	public String getDscOcorrencia1() {
		return dscOcorrencia1;
	}

	public void setDscOcorrencia1(String dscOcorrencia1) {
		this.dscOcorrencia1 = dscOcorrencia1;
	}

	public String getDscOcorrencia2() {
		return dscOcorrencia2;
	}

	public void setDscOcorrencia2(String dscOcorrencia2) {
		this.dscOcorrencia2 = dscOcorrencia2;
	}

	/**
	 * @return the enumStatus
	 */
	public EnumStatusCarga getEnumStatus() {
		return enumStatus;
	}

	/**
	 * @param enumStatus
	 *            the enumStatus to set
	 */
	public void setEnumStatus(EnumStatusCarga enumStatus) {
		this.enumStatus = enumStatus;
	}

}
